package online.inote.graphql.common.utils;

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

/**
 * @description: 返回结果工厂类
 * @author 	Sui
 * @Created 2019年3月28日 上午12:34:10
 * @version 1.0
 */
@Builder
public class ResultFactory<T> {

	public String code;
	public String message;
	public T data;
	
	/**
	 * @description: 返回结果数据转为Map
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:34:34
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Map<String, Object> dataToMap() {
		try {
			if (data == null) return null;
			return (Map<String, Object>) JSON.parseObject(JSON.toJSONString(data), HashMap.class);
		} catch (Exception e) {
			throw new RuntimeException("data转换Map失败");
		}
	}
	
	/**
	 * @description: 将工厂类转为JSON
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:49:00
	 * @return
	 */
	public String toJSON() {
		return JSON.toJSONString(this, SerializerFeature.WriteMapNullValue);
	}

	/**
	 * @description: 将工厂类转为JSONObject
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:49:00
	 * @return
	 */
	public JSONObject toJSONObject() {
		return JSON.parseObject(toJSON());
	}
	
	/**
	 * @description: 成功
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午1:19:43
	 * @return
	 */
	public static ResultFactory<Object> success() {
		return ResultFactory.builder().code(ResultEnum.SUCCESS.key).message(ResultEnum.SUCCESS.msg).build();
	}
	
	/**
	 * @description: 成功
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午1:18:19
	 * @param data
	 * @return
	 */
	public static <T> ResultFactory<T> success(final T data) {
		return new ResultFactory<>(ResultEnum.SUCCESS.key, ResultEnum.SUCCESS.msg, data);
	}
	
	/**
	 * @description: 失败
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午1:22:42
	 * @return
	 */
	public static ResultFactory<Object> fail() {
		return ResultFactory.builder().code(ResultEnum.FAIL.key).message(ResultEnum.FAIL.msg).build();
	}
	
	/**
	 * @description: 失败
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午1:23:04
	 * @param data
	 * @return
	 */
	public static <T> ResultFactory<T> fail(final T data) {
		return new ResultFactory<>(ResultEnum.FAIL.key, ResultEnum.FAIL.msg, data);
	}
	
	/**
	 * @description: 创建返回结果集
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:49:14
	 * @param result
	 * @return
	 */
	public static ResultFactory<Object> create(final ResultEnum result) {
		return ResultFactory.builder().code(result.key).message(result.msg).build();
	}
	
	/**
	 * @description: 创建返回结果集
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:49:38
	 * @param result
	 * @param message
	 * @return
	 */
	public static ResultFactory<Object> create(final ResultEnum result, final String message) {
		return ResultFactory.builder().code(result.key).message(message).build();
	}
	
	/**
	 * @description: 创建返回结果集
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:40:23
	 * @param data
	 * @param result
	 * @return
	 */
	public static ResultFactory<String> create(final String data, final ResultEnum result) {
		return new ResultFactory<>(result.key, result.msg, data);
	}
	
	/**
	 * @description: 创建返回结果集
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:49:48
	 * @param result
	 * @param t
	 * @return
	 */
	public static <T> ResultFactory<T> create(final ResultEnum result, final T t) {
		return new ResultFactory<>(result.key, result.msg, t);
	}
	
	/**
	 * @description: 创建返回结果集
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午1:24:08
	 * @param result
	 * @param message
	 * @param t
	 * @return
	 */
	public static <T> ResultFactory<T> create(final ResultEnum result, final String message, final T t) {
		return new ResultFactory<>(result.key, message, t);
	}
	
	/**
	 * @description: 创建返回结果集
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:49:57
	 * @param result
	 * @param message
	 * @param o
	 * @return
	 */
	public static ResultFactory<Object> create(final ResultEnum result, final String message, final Object... o) {
		return ResultFactory.builder().code(result.key).message(StringUtils.replaceParams(message, o)).build();
	}
	
	/**
	 * @description: 是否成功
	 * @author XQF.Sui
	 * @created 2019年3月28日 上午12:50:06
	 * @param factory
	 * @return
	 */
	public static boolean isSuccess(final ResultFactory<Object> factory) {
		return factory != null && ResultEnum.SUCCESS.key.equals(factory.code);
	}
	
	/**
	 * @description: 返回结果枚举类
	 * @author XQF.Sui
	 * @created 2019年4月12日 下午11:15:23
	 * @version 1.0
	 */
	@Getter
	@AllArgsConstructor
	public enum ResultEnum {

		SUCCESS("A10001", "成功"), FAIL("A10002", "失败"),

		PARAM_REQUIRED("A10003", "参数必填"), NOT_EXISTS("A10004", "该信息不存在"), EXISTS("A10005", "该信息已存在"),

		OWN_PERMISSION("A10006", "有权限"), NOT_PERMISSION("A10007", "没有权限");

		public String key;
		public String msg;
	}
}